package br.com.fsa.aplication.Model.bean;

import java.io.Serializable;
import java.util.Date;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
public class NotaFiscal implements Serializable
{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long nfID;
	@Column (nullable = false)
	private Integer nNF;
	@Temporal(TemporalType.TIMESTAMP)
	@Column (nullable = false)
	private Date dataEmissao;
	@Temporal(TemporalType.TIMESTAMP)
	@Column (nullable = false)
	private Date dataEntradaSaida;
	@Column (nullable = false)
	private Integer qtdVol;
	@Column (nullable = false , length = 20)
	private String esp;
	@Column (nullable = false)
	private Double pesoLig;
	@Column (nullable = false)
	private Double pesoBruto;
	@Enumerated(EnumType.STRING)
	@Column (nullable = false , length = 20)
	private NotaFiscalStatus status;
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "clienteID",  insertable = true, updatable = true)
	@Cascade(CascadeType.SAVE_UPDATE)
	@Fetch(FetchMode.JOIN)
	private Cliente cliente;
	@Column (nullable = false , length = 100)
	private String logradouro;
	@Column (nullable = false)
	private Integer numero;
	@Column (nullable = false , length = 10)
	private String cep;
	@Column (nullable = false , length = 100)
	private String cidade;
	@Column (nullable = false , length = 2)
	private String estado;
	@Column (nullable = false , length = 50)
	private String pais;
	@Column (nullable = false, length = 100)
	private String bairro;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "logisticaID", insertable = true, updatable = true)
	@Cascade(CascadeType.SAVE_UPDATE)
	@Fetch(FetchMode.JOIN)
	private Logistica logistica;
	// @ManyToMany(mappedBy="listaNotaFiscal",fetch=FetchType.LAZY)
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "produtoNotaId.notaFiscal")
	// @JoinTable(name = "DetalheNota", joinColumns = { @JoinColumn(name =
	// "nfID") }, inverseJoinColumns = { @JoinColumn(name = "produtoID") })
	private Set<DetalheNota> listaDetalhes;
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "conhecimentoID", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private Conhecimento conhecimento;
	@Column (nullable = false , length = 10)
	private String CFOP;
	@Column (nullable = false)
	private Double vrlTotal;

	public Double getVrlTotal()
	{
		return vrlTotal;
	}

	public void setVrlTotal(Double vrlTotal)
	{
		this.vrlTotal = vrlTotal;
	}

	public Set<DetalheNota> getListaDetalhes()
	{
		return listaDetalhes;
	}

	public void setListaDetalhes(Set<DetalheNota> listaDetalhes)
	{
		this.listaDetalhes = listaDetalhes;
	}

	public String getCFOP()
	{
		return CFOP;
	}

	public void setCFOP(String cFOP)
	{
		CFOP = cFOP;
	}

	public Long getNfID()
	{
		return nfID;
	}

	public Integer getnNF()
	{
		return nNF;
	}

	public void setnNF(Integer nNF)
	{
		this.nNF = nNF;
	}

	public Date getDataEmissao()
	{
		return dataEmissao;
	}

	public void setDataEmissao(Date dataEmissao)
	{
		this.dataEmissao = dataEmissao;
	}

	public Date getDataEntradaSaida()
	{
		return dataEntradaSaida;
	}

	public void setDataEntradaSaida(Date dataEntradaSaida)
	{
		this.dataEntradaSaida = dataEntradaSaida;
	}

	public Integer getQtdVol()
	{
		return qtdVol;
	}

	public void setQtdVol(Integer qtdVol)
	{
		this.qtdVol = qtdVol;
	}

	public String getEsp()
	{
		return esp;
	}

	public void setEsp(String esp)
	{
		this.esp = esp;
	}

	public Double getPesoLig()
	{
		return pesoLig;
	}

	public void setPesoLig(Double pesoLig)
	{
		this.pesoLig = pesoLig;
	}

	public Double getPesoBruto()
	{
		return pesoBruto;
	}

	public void setPesoBruto(Double pesoBruto)
	{
		this.pesoBruto = pesoBruto;
	}

	public NotaFiscalStatus getStatus()
	{
		return status;
	}

	public void setStatus(NotaFiscalStatus status)
	{
		this.status = status;
	}

	public Cliente getCliente()
	{
		return cliente;
	}

	public void setCliente(Cliente cliente)
	{
		this.cliente = cliente;
	}

	public Logistica getLogistica()
	{
		return logistica;
	}

	public void setLogistica(Logistica logistica)
	{
		this.logistica = logistica;
	}

	public Conhecimento getConhecimento()
	{
		return conhecimento;
	}

	public void setConhecimento(Conhecimento conhecimento)
	{
		this.conhecimento = conhecimento;
	}

	public String getLogradouro()
	{
		return logradouro;
	}

	public void setLogradouro(String logradouro)
	{
		this.logradouro = logradouro;
	}

	public Integer getNumero()
	{
		return numero;
	}

	public void setNumero(Integer numero)
	{
		this.numero = numero;
	}

	public String getCep()
	{
		return cep;
	}

	public void setCep(String cep)
	{
		this.cep = cep;
	}

	public String getCidade()
	{
		return cidade;
	}

	public void setCidade(String cidade)
	{
		this.cidade = cidade;
	}

	public String getEstado()
	{
		return estado;
	}

	public void setEstado(String estado)
	{
		this.estado = estado;
	}

	public String getPais()
	{
		return pais;
	}

	public void setPais(String pais)
	{
		this.pais = pais;
	}

	public void setNfID(Long nfID)
	{
		this.nfID = nfID;
	}

	public String getBairro()
	{
		return bairro;
	}

	public void setBairro(String bairro)
	{
		this.bairro = bairro;
	}

}
